/**  
 * ls1.c  
 *   
 * 目的：列出指定目录或当前目录的内容  
 *   
 * 行为：  
 * - 如果没有参数，列出当前目录的内容  
 * - 否则，列出指定的目录的内容  
 */  

#include <stdio.h>  
#include <stdlib.h>  
#include <sys/types.h>  
#include <dirent.h>  

/**  
 * 列出指定目录中的文件  
 *   
 * @param dirname 目录名称  
 */  
void list_directory(const char *dirname);  

int main(int argc, char *argv[]) {  
    if (argc == 1) {  
        // 如果没有参数，列出当前目录  
        list_directory(".");  
    } else {  
        for (int i = 1; i < argc; i++) {  
            printf("%s:\n", argv[i]);  
            list_directory(argv[i]);  
            // 在多个目录时，分隔输出  
            if (i < argc - 1) {  
                printf("\n");  
            }  
        }  
    }  
    return 0;  
}  

void list_directory(const char *dirname) {  
    DIR *dir_ptr = opendir(dirname);        // 打开目录  
    struct dirent *entry;  

    if (dir_ptr == NULL) {  
        perror(dirname);  
        exit(EXIT_FAILURE);  
    }  

    while ((entry = readdir(dir_ptr)) != NULL) {  
        printf("%s\n", entry->d_name);  
    }  

    if (closedir(dir_ptr) != 0) {         // 关闭目录并检查错误  
        perror("closedir");  
        exit(EXIT_FAILURE);  
    }  
}